package seguranca;

import entidade.LoginUsuario;
import entidade.PermissaoUsuario;
import entidade.TipoUsuario;
import java.util.HashSet;
import java.util.Set;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.apache.shiro.authc.SimpleAccount;
import org.apache.shiro.authz.Permission;
import org.apache.shiro.authz.SimpleRole;
import org.apache.shiro.authz.permission.WildcardPermission;
import org.apache.shiro.realm.SimpleAccountRealm;
import sessao.LoginUsuarioFacade;
import sessao.TipoUsuarioFacade;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author bruno
 */

@ManagedBean
public class OurRealm extends SimpleAccountRealm {

    @EJB
    private LoginUsuarioFacade ejbLogin;
    @EJB
    private TipoUsuarioFacade ejbTipo;

    public OurRealm() {
        super();

        InitialContext ic;
        try {
            ic = new InitialContext();
            ejbLogin = (LoginUsuarioFacade) ic.lookup("java:global/PROIN/LoginUsuarioFacade");
            ejbTipo = (TipoUsuarioFacade) ic.lookup("java:global/PROIN/TipoUsuarioFacade");
        } catch (NamingException e) {
            System.err.println("PROIN: Erro Ao Carregar EJB's: " + e.getMessage());
            e.printStackTrace();
        }
        initialize();
    }

    private void initialize() {
        users.clear();
        roles.clear();
        if (ejbLogin != null && ejbLogin != null) {

            //1º adicionar usuarios
            for (LoginUsuario el : ejbLogin.findAll()) {
                 addAccount(el.getNomeUsuario(), el.getSenha(), el.getFkTipoUsuario().getDesignacao());
                SimpleAccount sa = getUser(el.getNomeUsuario());
                //4º adicionar permissões
                for (PermissaoUsuario pu : el.getFkTipoUsuario().getPermissaoUsuarioCollection()) {
                    sa.addStringPermission(pu.getCaminho());
                }             
            }

            //estabelecer tipo existentes
            for (TipoUsuario tu : ejbTipo.findAll()) {
                Set<Permission> ps = new HashSet<Permission>();
                //2º adicionar regras ao tipo
                for (PermissaoUsuario pu : tu.getPermissaoUsuarioCollection()) {
                    ps.add(new WildcardPermission(pu.getCaminho()));
                    //System.out.println("role: " + tu.getDesignacao() + "-->permissao: " + pu.getCaminho());
                }
                //3º adicionar a tipo
                add(new SimpleRole(tu.getDesignacao(), ps));
            }
            
        } else {
            System.err.println("PROIN: EJB não Instanciado");
        }
        System.out.println("PROIN: CARREGOU HASH USERS");
    }

    @Override
    public boolean accountExists(String username) {
        initialize();
        return getUser(username) != null;
    }

    
    
}
